/*!
 * \file WtOrdMon.cpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 *
 * \brief 订单监控器实现
 * \details 实现订单的添加、删除、超时检查等功能，支持线程安全操作
 */
#include "WtOrdMon.h"

/**
 * @brief 添加订单到监控列表
 * @param ids 订单ID数组指针
 * @param cnt 订单数量
 * @param curTime 当前时间戳
 * @param bCanCancel 是否可以撤销，默认为true
 * @details 将多个订单批量添加到监控列表中，记录进入时间和撤销标志
 */
void WtOrdMon::push_order(const uint32_t* ids, uint32_t cnt, uint64_t curTime, bool bCanCancel /* = true */)
{
	StdLocker<StdRecurMutex> lock(_mtx_ords);
	for (uint32_t idx = 0; idx < cnt; idx++)
	{
		uint32_t localid = ids[idx];
		OrderPair& ordInfo = _orders[localid];
		ordInfo.first = curTime;
		ordInfo.second = bCanCancel;
	}
}

/**
 * @brief 从监控列表中删除订单
 * @param localid 本地订单号
 * @details 线程安全地从监控列表中移除指定订单
 */
void WtOrdMon::erase_order(uint32_t localid)
{
	StdLocker<StdRecurMutex> lock(_mtx_ords);
	auto it = _orders.find(localid);
	if (it == _orders.end())
		return;

	_orders.erase(it);
}

/**
 * @brief 检查订单是否超时
 * @param expiresecs 超时时间（秒）
 * @param curTime 当前时间戳
 * @param callback 超时订单回调函数
 * @details 遍历所有订单，检查是否超时，对超时且可撤销的订单调用回调函数
 */
void WtOrdMon::check_orders(uint32_t expiresecs, uint64_t curTime, EnumOrderCallback callback)
{
	if (_orders.empty())
		return;

	StdLocker<StdRecurMutex> lock(_mtx_ords);
	for (auto& m : _orders)
	{
		uint32_t localid = m.first;
		OrderPair& ordInfo = m.second;
		if(!ordInfo.second)	// 如果不能撤销，就直接跳过，下一个（比如涨跌停价的挂单是不能撤销的）
			continue;

		auto entertm = ordInfo.first;
		if (curTime - entertm < expiresecs * 1000)
			continue;

		callback(m.first);
	}
}

